package clases;

import es.deusto.ingenieria.is.search.formulation.Operator;
import es.deusto.ingenieria.is.search.formulation.State;

public class Mover extends Operator {

	// origen y destino
	int origen;
	int destino;

	public int getOrigen() {
		return origen;
	}

	public void setOrigen(int origen) {
		this.origen = origen;
	}

	public int getDestino() {
		return destino;
	}

	public void setDestino(int destino) {
		this.destino = destino;
	}

	public Mover() {
		super();
	}

	public Mover(int origen, int destino) {
		super();
		this.origen = origen - 1;
		this.destino = destino - 1;
		setName("Mover disco del soporte " + origen + " al soporte " + destino);
	}

	@Override
	protected State effect(State entorno) {
		State nuevoEntorno = ((Entorno) entorno).clone();
		Disco discoMovido = ((Entorno) nuevoEntorno).getSoportes().get(origen).getDiscos().pop();
		((Entorno) nuevoEntorno).getSoportes().get(destino).getDiscos().push(discoMovido);
		return nuevoEntorno;
	}

	@Override
	protected boolean isApplicable(State entorno) {
		Soporte soporteOrigen = ((Entorno) entorno).getSoportes().get(origen);
		Soporte soporteDestino = ((Entorno) entorno).getSoportes().get(destino);

		if (!soporteOrigen.getDiscos().isEmpty()) {
			if (!soporteDestino.getDiscos().isEmpty()) {
				if (soporteOrigen.getDiscos().peek().getTamano() < soporteDestino.getDiscos().peek().getTamano()) {
					return true;
				}
				else {
					return false;
				}
			}
			return true;
		}
		else {
			return false;
		}
	}
}
